package Data;

import Model.UsuarioBean;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.List;
import java.util.Vector;

public class UsuarioDAO extends Conexao {

    public Vector listarUsuarios(String parametro, int pesquisa) throws SQLException {
        //Declaro a consulta
        String sql = "SELECT USUCOD, USUNOME, USULOGIN, (CASE WHEN INATIVO = 'F' THEN 'Sim' ELSE 'Não' END ) INATIVO FROM USUARIO ";

        //Crio um vetor que vai contar as linhas da tabela
        Vector dados = new Vector();

        //se tiver algum nome pra pesquisar modifico a consulta
        if (parametro == null || parametro.isEmpty()) {
            pesquisa = -1;
        }

        switch (pesquisa) {
            //Pesquisa por nome
            case 0:
                sql += " WHERE USUNOME LIKE '%" + parametro + "%'";
                break;

            //pesquisa por login
            case 1:
                sql += " WHERE USULOGIN LIKE '%" + parametro + "%'";
                break;

        }

        //Pego uma conexao com o banco
        Connection conn = getConexao();

        //Preparo a consulta
        PreparedStatement ps = conn.prepareStatement(sql);

        //Executo a consulta
        ResultSet rs = ps.executeQuery();

        //Percorre todas as linhas de resultado da query
        while (rs.next()) {
            Vector linha = new Vector();

            //Preenche a linha com as informações
            linha.addElement(rs.getObject(1));
            linha.addElement(rs.getObject(2));
            linha.addElement(rs.getObject(3));
            linha.addElement(rs.getObject(4));

            dados.add(linha);
        }

        //Fecho o PreparedStatment
        ps.close();

        //Retorno os clientes encontrados
        return dados;

    }

    public List listarUsuariosAsList(String parametro) {
        return null;

    }

    public UsuarioBean getUsuario(int id) throws SQLException {
        //Declaro a query
        String sql = "SELECT * FROM USUARIO WHERE INATIVO = 'F' AND USUCOD = ?";

        //Declaro o objeto usuario de retorno caso ache algum
        UsuarioBean usuario = null;

        //Pego uma conexao com o banco
        Connection conn = getConexao();

        //Preparo a consulta
        PreparedStatement ps = conn.prepareStatement(sql);

        //Checo se o id é maior que zero
        if (id < 0) {
            return null;
        }

        //Coloco o parametro recebido pelo metodo na consulta
        ps.setInt(1, id);

        //Executo a consulta
        ResultSet rs = ps.executeQuery();

        //Checo se encontrou algum resultado
        if (rs.next()) {

            //Instancio o usuario
            usuario = new UsuarioBean();

            //Preenche o usuario com as informações
            usuario.setCodigo(rs.getInt(1));
            usuario.setNome(rs.getString(2));
            usuario.setLogin(rs.getString(3));
            usuario.setSenha(rs.getString(4));
            usuario.setAdmin(rs.getString(5).equalsIgnoreCase("F") ? false : true);

        }

        //Fecho o PreparedStatment
        ps.close();

        //Retorno o usuario
        return usuario;

    }

    public UsuarioBean getUsuario(String login) throws SQLException {
        //Declaro a query
        String sql = "SELECT * FROM USUARIO WHERE INATIVO = 'F' AND USULOGIN = ?";

        //Declaro o objeto usuario de retorno caso ache algum
        UsuarioBean usuario = null;

        //Pego uma conexao com o banco
        Connection conn = getConexao();

        //Preparo a consulta
        PreparedStatement ps = conn.prepareStatement(sql);

        //Valido o login
        if (login == null || login.isEmpty()) {
            return null;
        }

        //Coloco o parametro recebido pelo metodo na consulta
        ps.setString(1, login);

        //Executo a consulta
        ResultSet rs = ps.executeQuery();

        //Checo se encontrou algum resultado
        if (rs.next()) {

            //Instancio o usuario
            usuario = new UsuarioBean();

            //Preenche o usuario com as informações
            usuario.setCodigo(rs.getInt(1));
            usuario.setNome(rs.getString(2));
            usuario.setLogin(rs.getString(3));
            usuario.setSenha(rs.getString(4));
            usuario.setAdmin(rs.getString(5).equalsIgnoreCase("F") ? false : true);

        }

        //Fecho o PreparedStatment
        ps.close();

        //Retorno o usuario
        return usuario;

    }

    public boolean cadastrarUsuario(UsuarioBean usuario) throws SQLException {
        //Procedure de cadastrar usuario
        String sql = "{CALL CADASTRAR_USUARIO(?, ?, ?, ?, ?)}";

        //Validação
        if (usuario == null) {
            throw new SQLException("Usuario invalido, objeto nulo!!");
        }

        //Pego uma conexao com o banco
        Connection conn = getConexao();

        //Preparo a consulta
        CallableStatement ps = conn.prepareCall(sql);

        //Coloco os parametros na consulta
        ps.setString(1, usuario.getNome());
        ps.setString(2, usuario.getLogin());
        ps.setString(3, usuario.getSenha());
        ps.setString(4, usuario.isAdmin() ? "T" : "F");
        ps.setString(5, ""); //Parametro de saida

        //registro os parametros de saida
        ps.registerOutParameter(5, Types.VARCHAR);

        //Executo a procedure
        ps.execute();

        //Pego o resultado
        String saida = ps.getString(5);

        //Fecho o preparedStatment
        ps.close();

        //Retorno o resultado
        if (saida.equalsIgnoreCase("SUCESSO")) {
            return true;
        } else {
            throw new SQLException(saida);
        }
    }

    public boolean deletarUsuario(int id) throws SQLException {

        //Validação do id
        if (id < 0) {
            return false;
        }

        //Declaro a query
        String sql = "UPDATE USUARIO SET INATIVO = 'T' WHERE USUCOD = ?";

        //Pego uma conexao com o banco
        Connection conn = getConexao();

        //Preparo a consulta
        PreparedStatement ps = conn.prepareStatement(sql);

        //Coloco os parametros na consulta
        ps.setInt(1, id);

        //Executo a consulta
        int resultado = ps.executeUpdate();

        //Fecho o preparedStatment
        ps.close();

        //Verifico se atualizou algum registro
        if (resultado >= 1) {
            return true;
        } else {
            return false;
        }

    }

    public boolean deletarUsuario(UsuarioBean usuario) throws SQLException {
        //valido usuario
        if (usuario == null || usuario.getCodigo() < 1) {
            return false;
        } else {
            return deletarUsuario(usuario.getCodigo());
        }


    }

    public boolean validarUsuario(UsuarioBean usuario) throws SQLException {
        if (usuario == null) {
            return false;
        }

        //Declaro a query
        String sql = "SELECT * FROM USUARIO WHERE USULOGIN = ? AND USUSENHA = ? AND INATIVO = 'F'";

        //Pego uma conexao com o banco
        Connection conn = getConexao();

        //Preparo a consulta
        PreparedStatement ps = conn.prepareStatement(sql);

        //Coloco os parametros na consulta
        ps.setObject(1, usuario.getLogin());
        ps.setObject(2, usuario.getSenha());

        //Executo a consulta
        ResultSet rs = ps.executeQuery();

        if (rs.next()) {
            return true;
        } else {
            return false;
        }
    }

    public boolean atualizarUsuario(UsuarioBean usuario, boolean senha) throws SQLException {
        //Validação do id
        if (usuario == null || usuario.getCodigo() < 1) {
            throw new SQLException("Erro, usuario invalido");
        }

        //Declaro a query
        String sql = null;
        if (senha) {
            sql = "UPDATE USUARIO "
                    + " SET USUNOME = ?, USULOGIN = ?, USUSENHA = ?, USUADMIN = ?"
                    + " WHERE USUCOD = ?";
        } else {
            sql = "UPDATE USUARIO "
                    + " SET USUNOME = ?, USULOGIN = ?, USUADMIN = ?"
                    + " WHERE USUCOD = ?";
        }


        //Pego uma conexao com o banco
        Connection conn = getConexao();

        //Preparo a consulta
        PreparedStatement ps = conn.prepareStatement(sql);

        //Coloco os parametros na consulta baseado na senha ou não
        if (senha) {
            ps.setObject(1, usuario.getNome());
            ps.setObject(2, usuario.getLogin());
            ps.setObject(3, usuario.getSenha());
            ps.setObject(4, usuario.isAdmin() == true ? "T" : "F");
            ps.setObject(5, usuario.getCodigo());
        } else {
            ps.setObject(1, usuario.getNome());
            ps.setObject(2, usuario.getLogin());
            ps.setObject(3, usuario.isAdmin() == true ? "T" : "F");
            ps.setObject(4, usuario.getCodigo());
        }



        //Executo a consulta
        int resultado = ps.executeUpdate();

        //Fecho o preparedStatment
        ps.close();

        //Verifico se atualizou algum registro
        if (resultado >= 1) {
            return true;
        } else {
            return false;
        }
    }
}
